'use strict';

/**
 * @ngdoc overview
 * @name prestamosApp
 * @description
 * # prestamosApp
 *
 * Main module of the application.
 */
angular

  /*
   * Definición del módulo principal.
   */
  .module('prestamosApp', [
    'ngAnimate',
    'ngCookies',
    'ngResource',
    'ngRoute',
    'ngSanitize',
    'ngTouch',
    'ui.bootstrap',
    'Controllers',
    'Factories'
  ])
  /*
   * TODO: obtener desde backend.
   * Definición de roles.
   */
  .constant('ROLES', [
    {id: 1, descripcion: 'Admin'},
    {id: 2, descripcion: 'Investigador'}
  ])

  /*
   * Configuración de routing de la aplicación.
   */
  .config(function ($routeProvider, $locationProvider, ROLES) {
    $routeProvider
      .when('/', {
        templateUrl: 'views/main.html',
        controller: 'MainCtrl',
        rolesPermitidos: ROLES
      })
      .when('/dispositivos', {
        templateUrl: 'views/dispositivos.html',
        controller: 'DispositivosCtrl',
        rolesPermitidos: ROLES
      })
      .when('/prestamo/:dispositivoId', {
        templateUrl: 'views/prestamo.html',
        controller: 'PrestamoCtrl',
        rolesPermitidos: [ROLES[1]]
      })
      .when('/login', {
        templateUrl: 'views/login.html',
        controller: 'LoginCtrl',
        rolesPermitidos: ROLES
      })
      .when('/admin/solicitudes', {
        templateUrl: 'views/admin/solicitudes.html',
        controller: 'AdminSolicitudesCtrl',
        rolesPermitidos: [ROLES[0]]
      })
      .when('/not-found', {
        templateUrl: '404.html'
      })
      .when('/unauthorised', {
        templateUrl: '401.html',
        rolesPermitidos: []
      })
      .otherwise({
        redirectTo: '/not-found'
      });
  })

  /*
   * Control de acceso de la aplicación.
   */
  .run(function ($rootScope, $location, $route, Sesion, Auth) {
    $rootScope.url = 'http://localhost:8080/prestamodispositivos/resources/';

    $rootScope.$on('$routeChangeStart', function(scope, next) {
      var urlSiguiente = next.$$route.originalPath;

      if (!(/(.)*\/(not-found|unauthorised)/.test(urlSiguiente))) {
        var noEsUrlDeLogin = !(/(.)*\/login/.test(urlSiguiente));
        var rutaSiguiente = next.$$route;

        if (noEsUrlDeLogin) {
          /**
           * Si la ruta no existe, dirigimos a la página de error.
           */
          if (angular.isUndefined(rutaSiguiente)) {
            $location.path('/not-found');

          /*
           * Si la sesión está iniciada, verificamos autorización. En caso
           * contrario, redirigimos a página de login.
           */

          } else if (!Sesion.estaIniciada) {
            $location.path('/login');
          } else if (!Auth.estaAutorizado(rutaSiguiente.rolesPermitidos)) {
            $location.path('/unauthorised');
          }
        } else if (Sesion.estaIniciada) {
          /*
           * No debemos permitir entrar a página de login si ya está iniciada la
           * sesión.
           */
          event.preventDefault();
        }
      }
    });

  });

angular.module('Controllers', []);
angular.module('Factories', []);
